/////////////////////////////////////////////////////////////////////////
// 词法分析
// 本节没有提供词法分析器，直接提供了一个Token串。
// 语法分析程序可以从Token串中依次读出一个个Token，也可以重新定位Token串的当前读取位置。

//Token的类型
export enum TokenKind {Keyword, Identifier, StringLiteral, Seperator, Operator, EOF};

// 代表一个Token的数据结构
export interface Token{
    kind:TokenKind;
    text:string;
}

/**
 * 简化的词法分析器
 * 语法分析器从这里获取Token。
 * 支持下面两个操作：
 * next(): 返回当前的Token，并移向下一个Token。
 * peek(): 返回当前的Token，但不移动当前位置。
 */
export class Tokenizer{
    private tokens: Token[];
    private pos:number = 0;

    constructor(tokens:Token[]){
        this.tokens = tokens;
    }

    //获取下一个token，pos+1
    next():Token{
        if (this.pos < this.tokens.length){
            return this.tokens[this.pos++];
        }
        else{
            //如果已经到了末尾，总是返回EOF
            return this.tokens[this.pos];
        }
    }

    //获取下一个token，但不修改pos
    peek():Token{
        if (this.pos < this.tokens.length){
            return this.tokens[this.pos];
        }
        else{
            //如果已经到了末尾，总是返回EOF
            return this.tokens[this.pos];
        }
    }

    position():number{
        return this.pos;
    }

    traceBack(newPos:number):void{
        this.pos = newPos;
    }
}
